home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 6 / FM Towns Free Software Collection 6.iso / t_os / cdst / cdst.c next >
C/C++ Source or Header  |  1993-07-08  |  3KB  |  134 lines

  1. #include    <stdio.h>
  2. #include    <stdio.h>
  3.  
  4. #define        abs(x) ( (x) > 0 ? (x) : -(x) )
  5. #define        tosec(x) ( ( x.min ) * 60 + ( x.sec ) )
  6.  
  7. int info( void ) ;
  8. void sort( void ) ;
  9. void sort_loop( void ) ;
  10.  
  11. typedef struct
  12.     {
  13.     unsigned char min ;
  14.     unsigned char sec ;
  15.     unsigned char frame ;
  16.     } CDTIME ;
  17.  
  18. int buff[40], sec[40], count[40] ;
  19. int combi, loop, song, half_song, min_sec ;
  20.  
  21. void main( void )
  22.     {
  23.     int i, j, k ;
  24.     printf( "CDを準備してください\n" ) ;
  25.     printf( "用意が出来たらリターンを入力してください。\n" ) ;
  26.     while( getchar( ), ( song = info( ) ) == 0 )
  27.         {
  28.         printf( "CDの準備ができてません。\n" ) ;
  29.         printf( "もう一度確認してリターンを入力してください。\n" ) ;
  30.         }
  31.     printf( "このCDには %d 曲入ってます。\n",song ) ;
  32.     printf( "ソートを開始します。\n\n" ) ;
  33.  
  34.     sort( ) ;
  35.  
  36.     printf( "A面\n" ) ;
  37.     for( k = 0, i = 1 ; i <= buff[0] ; i++ )
  38.         {
  39.         printf( "track:%2d---time:%2d'%2d\x22\n",
  40.             buff[i], sec[buff[i]]/60, sec[buff[i]]%60 ) ;
  41.         k += sec[buff[i]] ;
  42.         }
  43.     printf( "     total time:%2d'%2d\x22\n\n", k/60, k%60 ) ;
  44.     printf( "B面\n" ) ;
  45.  
  46.     for( k = 0, i = j = 1 ; i <= song ; i++ )
  47.         {
  48.         if( i == buff[j] )
  49.             j++ ;
  50.         else
  51.             {
  52.             printf( "track:%2d---time:%2d'%2d\x22\n",
  53.                 i, sec[i]/60, sec[i]%60 ) ;
  54.             k += sec[i] ;
  55.             }
  56.         }
  57.     printf( "     total time:%2d'%2d\x22\n\n", k/60, k%60 ) ;
  58.     }
  59.  
  60. int info( void )
  61.     {
  62.     int cdtype, starttrack, endtrack, i, j, dummy[40] ;
  63.     CDTIME track[100], disc ;
  64.     for( j = 0 ; j <= 255 ; j++ )
  65.         {
  66.         i = cdr_cdinfo( 0, &cdtype, &starttrack, &endtrack, track, &disc ) ;
  67.         if( i == 0 )
  68.             break ;
  69.         }
  70.     if( i != 0 )
  71.         return( 0 ) ;
  72.     track[endtrack].min = disc.min;
  73.     track[endtrack].sec = disc.sec;
  74.     track[endtrack].frame = disc.frame;
  75.     if( --track[endtrack].frame < 0 )
  76.         {
  77.         track[endtrack].frame = 74 ;
  78.         if( --track[endtrack].sec < 0 )
  79.             {
  80.             track[endtrack].sec = 59 ;
  81.             --track[endtrack].frame ;
  82.             }
  83.         }
  84.     for( i = j = 1 ; i <= endtrack ; i++ )
  85.         if( ( track[i-1].min & 0x80 ) == 0 )
  86.             {
  87.             sec[j] = tosec( track[i] ) - tosec( track[i-1] ) ;
  88.             j++ ;
  89.             }
  90.     return( j - 1 ) ;
  91.     }
  92.  
  93. void sort( void )
  94.     {
  95.     int i ;
  96.     for( *sec = 0, i = 1 ; i <= song ; i++ )
  97.         *sec += sec[i] ;
  98.     half_song = ( song >> 1 ) ;
  99.     count[0] = 0 ;
  100.     loop = 0 ;
  101.     min_sec = *sec ;
  102.     for( combi = half_song ; combi >= 1 ; combi-- )
  103.         {
  104.         sort_loop( ) ;
  105.         printf( "%02d ", combi ) ;
  106.         }
  107.     printf( "\n\n" ) ;
  108.     }
  109.  
  110. void sort_loop( void )
  111.     {
  112.     int i, j ;
  113.     if( loop != combi )
  114.         {
  115.         loop++ ;
  116.         for( count[loop] = count[loop-1] + 1 ; 
  117.             count[loop] <= song - combi + loop ; count[loop]++ )
  118.             sort_loop( ) ;
  119.         loop-- ;
  120.         }
  121.     else
  122.         {
  123.         for( j = 0, i = 1 ; i <= combi ; i++ )
  124.             j += sec[count[i]] ;
  125.         if( abs( *sec - 2 * j ) < min_sec )
  126.             {
  127.             for( i = 1 ; i <= combi ; i++ )
  128.                 buff[i] = count[i] ;
  129.             buff[0] = combi ;
  130.             min_sec = abs( *sec - 2 * j ) ;
  131.             }
  132.         }
  133.     }
  134.